/**********************************************************************************\
** 文件名称: usart1.c
** 创建人员: YCG
** 创建日期: 2018-11-10
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include "uart.h"
#include "print.h"

#include "cache.h"

#include "usbd_cdc_if.h"

CacheHead_t TxCache = {NULL, NULL, NULL};      //发送缓存头部
uint8_t TxState = 0;                           //发送状态
extern UART_HandleTypeDef Uprintf_usart;              //串口1对象
uint8_t RxData = 0;

/*******************************************************************************
** 函数名称: Uprintf
** 功能描述: 格式化数据输出
** 参数说明: fmt: [输入] 格式化字符串
**			     ...: [输入] 可变参数列表
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-11
********************************************************************************/
void Uprintf(char *fmt, ...)
{
    va_list arp;
    va_start (arp, fmt);         /* 将可变长参数转换为va_list */

    CacheItem_t * yCache = CacheGet(&TxCache, BUFLENGH);     //获取缓存空间

    if(yCache != NULL) {

        uint8_t*  CacheAdd = CacheGetAdd(yCache);            //换取缓存的数据储存地址

        uint16_t  ySize = PrintArray(CacheAdd, fmt, arp);	   //将数据格式化进缓存中

        CacheUse(yCache, ySize);                   //记录已经使用了的数据块大小，释放掉未使用的内存空间

        if(TxState == 0) {                         //如果没有正在发送，就启动发送
            TxState = 1;                           //标志置1，表示正在发送

            yCache = CacheRead(&TxCache);          //获取当前的发送数据块

            CDC_Transmit_FS(CacheGetAdd(yCache), yCache->Size);
            HAL_UART_Transmit_DMA(&Uprintf_usart, CacheGetAdd(yCache), yCache->Size);   //启动DMA发送
        }
    }
    va_end (arp);
}

/*******************************************************************************
** 函数名称: UprintfBuf
** 功能描述: 批量数据输出
** 参数说明: ydata: [输入] 数据地址
**			     ySize: [输入] 数据数量
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-04-30
********************************************************************************/
void UprintfBuf(uint8_t* ydata, uint16_t ySize)
{
    CacheItem_t * yCache = CacheGet(&TxCache, ySize);     //获取缓存空间
    uint8_t*  CacheAdd;
    if(yCache != NULL) {
        CacheAdd = CacheGetAdd(yCache);            //换取缓存的数据储存地址
        memcpy(CacheAdd, ydata, ySize);
        if(TxState == 0) {                         //如果没有正在发送，就启动发送
            TxState = 1;                           //标志置1，表示正在发送

            yCache = CacheRead(&TxCache);          //获取当前的发送数据块

            CDC_Transmit_FS(CacheGetAdd(yCache), yCache->Size);
            HAL_UART_Transmit_DMA(&Uprintf_usart, CacheGetAdd(yCache), yCache->Size);   //启动DMA发送
        }
    }
}

/*******************************************************************************
** 函数名称: Uprint_Callback
** 功能描述: 串口发送完成回调函数
** 参数说明: huart: [输入] 当前完成发送的串口对象
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-02-08
********************************************************************************/
void Uprint_Callback(void)
{

    CacheItem_t * yCache = CacheRead(&TxCache);   //获取当前的发送数据块

    if(yCache != NULL) {     //如果还有发送内容
        CDC_Transmit_FS(CacheGetAdd(yCache), yCache->Size);
        HAL_UART_Transmit_DMA(&Uprintf_usart, CacheGetAdd(yCache), yCache->Size);     //继续发送
    } else {
        TxState = 0;   //表示没有数据正在发送了
    }
}

/*******************************************************************************
** 函数名称: HAL_UART_TxCpltCallback
** 功能描述: 串口发送完成回调函数
** 参数说明: huart: [输入] 当前完成发送的串口对象
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-02-08
********************************************************************************/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart == &Uprintf_usart) {
        Uprint_Callback();
    }
}

/********************************End of File************************************/

